package com.jinbm.common.util;

import org.springframework.web.util.HtmlUtils;
import org.springframework.web.util.JavaScriptUtils;

import java.beans.PropertyEditorSupport;

/**
 * 转义工具类（主要针对xss攻击）
 *
 * @author jinbm
 * @date 2024/7/8
 * @since 1.0
 */
public class StringEscapeEditor extends PropertyEditorSupport {

    private boolean escapeHTML;// 编码HTML
    private boolean escapeJavaScript;// 编码javascript

    public StringEscapeEditor() {
        super();
    }

    /**
     * 允许设置初始化时的HTML和JavaScript编码标志
     *
     * @date 2024/7/8
     * @param escapeHTML
     * @param escapeJavaScript
     */
    public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript) {
        super();
        this.escapeHTML = escapeHTML;
        this.escapeJavaScript = escapeJavaScript;
    }

    /**
     * 将属性值转换为文本表示
     * 获取当前属性的值，如果值不为null，则将其转换为字符串返回；否则返回空字符串
     *
     * @author Jinbm
     * @date 2024/7/8
     * @return String
     */
    @Override
    public String getAsText() {
        Object value = getValue();
        return value != null ? value.toString() : "";

    }

    /**
     * 将文本转换为属性的值
     *
     * @date 2024/7/8
     * @param text  The string to be parsed.
     * @throws IllegalArgumentException
     */
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        /*
            如果传入的文本为null，则设置属性值为null。
            否则，将文本赋给局部变量 value。
            如果 escapeHTML 为true，则调用 HtmlUtils.htmlEscape(value) 对文本进行HTML编码。
            如果 escapeJavaScript 为true，则调用 JavaScriptUtils.javaScriptEscape(value) 对文本进行JavaScript编码。
            最后，将处理过的文本值设置为属性的值。
        */
        if (text == null) {
            setValue(null);
        } else {
            String value = text;
            if (escapeHTML) {
                value = HtmlUtils.htmlEscape(value);
            }
            if (escapeJavaScript) {
                value = JavaScriptUtils.javaScriptEscape(value);
            }
            setValue(value);
        }
    }
}
